home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / gnome-games / aisleriot / games / napoleons_tomb.scm < prev    next >
Encoding:
Text File  |  2009-04-14  |  9.8 KB  |  410 lines

  1. ; AisleRiot - napoleons_tomb.scm
  2. ; Copyright (C) 2007 Kimmo Karlsson <kimmo.karlsson@gmail.com>
  3. ;
  4. ; This game is free software; you can redistribute it and/or modify
  5. ; it under the terms of the GNU General Public License as published by
  6. ; the Free Software Foundation; either version 2, or (at your option)
  7. ; any later version.
  8. ;
  9. ; This program is distributed in the hope that it will be useful,
  10. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ; GNU General Public License for more details.
  13. ;
  14. ; You should have received a copy of the GNU General Public License
  15. ; along with this program; if not, write to the Free Software
  16. ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  17. ; USA
  18.  
  19.  
  20. ;;;;
  21. ;; Settings:
  22. ;;
  23. ;;;;
  24.  
  25.  
  26. ;;
  27. ;; True if dealing three cards at a time
  28. ;;
  29. (define deal-three #f)
  30.  
  31.  
  32. ;;
  33. ;; Number of redeals left
  34. ;;
  35. (define max-redeals 0)
  36.  
  37.  
  38. ;;
  39. ;; True if automatically playing cards that fit
  40. ;;
  41. (define autoplay #f)
  42.  
  43.  
  44. ;;;;
  45. ;; Table set up:
  46. ;;
  47. ;;;;
  48. (define stock 0)
  49. (define waste 1)
  50. (define center-slot 6)
  51. (define corner-slots '(2 4 8 10))
  52. (define reserve-slots '(3 5 7 9))
  53.  
  54.  
  55. ;;;;
  56. ;; Functions:
  57. ;;
  58. ;;;;
  59.  
  60.  
  61. ;;;;
  62. ;; Sets up the table.
  63. ;;
  64. ;; Returns: tuple of playing area size: {width, height} (in card-slots)
  65. ;;;;
  66. (define (new-game)
  67.   (initialize-playing-area)
  68.   (set-ace-low)
  69.   (make-standard-deck)
  70.   (shuffle-deck)
  71.  
  72.   (add-normal-slot DECK)      ;; SLOT 0 - deck
  73.   ;; SLOT 1 - turned deck
  74.   (if deal-three
  75.       (add-partially-extended-slot '() right 3)
  76.       (add-normal-slot '()))
  77.   (add-blank-slot)
  78.  
  79.   (add-normal-slot '())       ;; SLOT 2 - upper left
  80.   (add-normal-slot '())       ;; SLOT 3 - top
  81.   (add-normal-slot '())       ;; SLOT 4 - upper-right
  82.   (add-carriage-return-slot)
  83.   (add-blank-slot)
  84.   (add-blank-slot)
  85.   (add-blank-slot)
  86.   (add-normal-slot '())       ;; SLOT 5 - left
  87.   (add-normal-slot '())       ;; SLOT 6 - center
  88.   (add-normal-slot '())       ;; SLOT 7 - right
  89.   (add-carriage-return-slot)
  90.   (add-blank-slot)
  91.   (add-blank-slot)
  92.   (add-blank-slot)
  93.   (add-normal-slot '())       ;; SLOT 8 - lower left
  94.   (add-normal-slot '())       ;; SLOT 9 - bottom
  95.   (add-normal-slot '())       ;; SLOT 10 - lower right
  96.  
  97.   (give-status-message)
  98.   
  99.   ;; window is 6x3 cards
  100.   (list 6 3))
  101.  
  102.  
  103. ;;;;
  104. ;; Defines which slots contain draggable cards.
  105. ;;
  106. ;; Returns: true or false 
  107. ;;;;
  108. (define (button-pressed slot-id card-list)
  109.   (and (member slot-id (append (list waste) reserve-slots))
  110.        (not (null? card-list))))
  111.  
  112.  
  113. ;;;;
  114. ;; Checks if the given move is valid.
  115. ;;
  116. ;; Params:
  117. ;;   - start: start slot
  118. ;;   - pcard: card begin played
  119. ;;   - end: end slot
  120. ;;
  121. ;; Returns: true if card is valid
  122. ;;;;
  123. (define (valid-card? start pcard end)
  124.   (and (not (= start end))
  125.        (or
  126.     ;; putting card to place-holder slot
  127.     (and (empty-slot? end) (member end reserve-slots))
  128.     ;; putting card to the center slot
  129.     (and (= end center-slot)
  130.          (or (and (= (get-value pcard) 6) (or (empty-slot? end) (= 1 (get-value (get-top-card end)))))
  131.          (and (not (empty-slot? end)) (= (- (get-value (get-top-card 6)) (get-value pcard)) 1))))
  132.     ;; putting card to a corner slot
  133.     (and (member end corner-slots)
  134.          (or (and (empty-slot? end) (= (get-value pcard) 7))
  135.          (and (not (empty-slot? end)) (= (- (get-value pcard) (get-value (get-top-card end))) 1)))))))
  136.  
  137.  
  138. ;;;;
  139. ;; Checks if the given card can be dropped to the given slot.
  140. ;;
  141. ;; Returns: true if card is valid
  142. ;;;;
  143. (define (droppable? start-slot card-list end-slot)
  144.   (and (not (null? card-list))
  145.        (= 1 (length card-list))
  146.        (valid-card? start-slot (car card-list) end-slot)))
  147.  
  148.  
  149. ;;;;
  150. ;; Drops the given card to the given slot if possible.
  151. ;;
  152. ;; Returns: true if card is moved
  153. ;;;;
  154. (define (button-released start-slot card-list end-slot)
  155.   (and (droppable? start-slot card-list end-slot)
  156.        (begin (move-n-cards! start-slot end-slot card-list)
  157.           (if (or (= center-slot end-slot) 
  158.               (member end-slot corner-slots))
  159.           (add-to-score! 1))
  160.           (try-to-autoplay))))
  161.  
  162.  
  163. ;;;;
  164. ;; Handles a mouse click of the given slot.
  165. ;;
  166. ;; Returns: true or false
  167. ;;;;
  168. (define (button-clicked slot-id) 
  169.   (and (= stock slot-id)
  170.        (flip-stock stock waste max-redeals
  171.            (if deal-three 3 1))
  172.        (try-to-autoplay)))
  173.  
  174.  
  175. ;;;;
  176. ;; Moves the given card from the given start slot 
  177. ;; to the given end slot if the move is valid.
  178. ;;
  179. ;; Params:
  180. ;;   - start: start slot id
  181. ;;   - pcard: the card at the top of the start slot
  182. ;;   - end: end slot id
  183. ;;
  184. ;; Returns: true if card moved, false otherwise
  185. ;;;;
  186. (define (move-if-valid start pcard end)
  187.   (and (valid-card? start pcard end)
  188.        (begin (move-n-cards! start end (list pcard))
  189.           (remove-card start)
  190.           (add-to-score! 1)
  191.           #t)))
  192.  
  193.  
  194. ;;;;
  195. ;; Moves the given card if the end slot is empty.
  196. ;;
  197. ;; Returns: true if card moved, false otherwise
  198. ;;;;
  199. (define (move-if-empty start pcard end)
  200.   (and (empty-slot? end)
  201.        (begin (move-n-cards! start end (list pcard))
  202.           (remove-card start) #t)))
  203.  
  204.  
  205. ;;;;
  206. ;; Moves the card at the given slot to its final place if possible.
  207. ;;
  208. ;; Returns: true if a card moved, false if no card moved
  209. ;;;;
  210. (define (autoplay-slot slot-id try-empties)
  211.   (and (not (empty-slot? slot-id))
  212.        (let ((c (get-top-card slot-id)))
  213.      (or (and (or (= waste slot-id) (member slot-id reserve-slots))
  214.           (or (move-if-valid slot-id c 6)
  215.               (move-if-valid slot-id c 2)
  216.               (move-if-valid slot-id c 4)
  217.               (move-if-valid slot-id c 8)
  218.               (move-if-valid slot-id c 10)))
  219.          (and try-empties
  220.           (eq? waste slot-id)
  221.           (or (move-if-empty slot-id c 3)
  222.               (move-if-empty slot-id c 5)
  223.               (move-if-empty slot-id c 7)
  224.               (move-if-empty slot-id c 9)))))))
  225.  
  226.  
  227. ;;;;
  228. ;; Handles a double-click of the given slot.
  229. ;;
  230. ;; Returns: true or false
  231. ;;;;
  232. (define (button-double-clicked slot-id)
  233.   (and (autoplay-slot slot-id #t)
  234.        (try-to-autoplay)))
  235.  
  236.  
  237. ;;;;
  238. ;; Tries to autoplay any playable card on the table.
  239. ;;
  240. ;; Returns: true
  241. ;;;;
  242. (define (try-to-autoplay)
  243.   (define (autoplay-loop)
  244.     (if (or (autoplay-slot waste #f)
  245.         (autoplay-slot 3 #f)
  246.         (autoplay-slot 5 #f)
  247.         (autoplay-slot 7 #f)
  248.         (autoplay-slot 9 #f))
  249.     (delayed-call autoplay-loop) #f))
  250.   (or (and autoplay (delayed-call autoplay-loop)) #t))
  251.  
  252.  
  253. ;;;;
  254. ;; Checks if the game is still continuable.
  255. ;;
  256. ;; Returns: true or false
  257. ;;;;
  258. (define (game-continuable)
  259.   (give-status-message)
  260.   (or (valid-move? waste)
  261.       (valid-move? 3)
  262.       (valid-move? 5)
  263.       (valid-move? 7)
  264.       (valid-move? 9)
  265.       (not (empty-slot? stock))
  266.       (and (not (game-won)) (< FLIP-COUNTER max-redeals))))
  267.  
  268.  
  269. ;;;;
  270. ;; Checks if there is a moveable card at the top of the given slot.
  271. ;;
  272. ;; Returns: true or false
  273. ;;;;
  274. (define (valid-move? slot-id)
  275.   (and (not (empty-slot? slot-id))
  276.        (let ((c (get-top-card slot-id)))
  277.      (or (empty-slot? 3)
  278.          (empty-slot? 5)
  279.          (empty-slot? 7)
  280.          (empty-slot? 9)
  281.          (valid-card? slot-id c 2)
  282.          (valid-card? slot-id c 4)
  283.          (valid-card? slot-id c 6)
  284.          (valid-card? slot-id c 8)
  285.          (valid-card? slot-id c 10)))))
  286.  
  287.  
  288. ;;;;
  289. ;; Checks if the player has finished the game successfully.
  290. ;;
  291. ;; Returns: true or false
  292. ;;;;
  293. (define (game-won)
  294.   (and (empty-slot? stock) 
  295.        (empty-slot? waste)
  296.        (empty-slot? 3)
  297.        (empty-slot? 5)
  298.        (empty-slot? 7)
  299.        (empty-slot? 9)))
  300.  
  301.  
  302. ;;;;
  303. ;; Returns the id of a slot that has a top card that 
  304. ;; can be moved to a foundation pile, or zero if no such slot found.
  305. ;;
  306. ;; Returns: slot id
  307. ;;;;
  308. (define (get-reserve-with-possible-move)
  309.   ;; Checks if a card at the top of the given slot can be 
  310.   ;; moved to a foundation pile.
  311.   (define (possible-move? slot-id)
  312.     (if (empty-slot? slot-id) #f
  313.     (let ((c (get-top-card slot-id)))
  314.       (or (valid-card? slot-id c 2)
  315.           (valid-card? slot-id c 4)
  316.           (valid-card? slot-id c 6)
  317.           (valid-card? slot-id c 8)
  318.           (valid-card? slot-id c 10)))))
  319.   ;; Returns zero or the id of a slot in the given list of slots
  320.   ;; that has a top card that can be moved to a foundation pile
  321.   (define (inner-loop slot-list)
  322.     (if (null? slot-list) 0
  323.     (let ((slot-id (car slot-list)))
  324.       (if (possible-move? slot-id) slot-id
  325.           (inner-loop (cdr slot-list))))))
  326.   ;;
  327.   (inner-loop (append reserve-slots (list waste))))
  328.  
  329.  
  330. ;;;;
  331. ;; Returns a hint for the current situation.
  332. ;;
  333. ;; Returns: list with zero and a hint string
  334. ;;;;
  335. (define (get-hint)
  336.   (let ((slot-id (get-reserve-with-possible-move)))
  337.     (if (< 0 slot-id)
  338.     (list 2 (get-name (get-top-card slot-id)) (_"the foundation"))
  339.     (list 0 (_"Deal a new card from the deck")))))
  340.  
  341.  
  342. ;;;;
  343. ;; Sets the status bar message.
  344. ;;
  345. ;; Returns: void
  346. ;;;;
  347. (define (give-status-message)
  348.   ;;
  349.   (define (get-redeals-string)
  350.     (if (not deal-three) ""
  351.     (string-append (_"Redeals left:") " "
  352.                (number->string (- max-redeals FLIP-COUNTER)))))
  353.   ;;
  354.   (define (get-stock-string)
  355.     (string-append (_"Stock left:") " " 
  356.            (number->string (length (get-cards stock)))))
  357.  
  358.   (set-statusbar-message (string-append (get-stock-string)
  359.                     "   "
  360.                     (get-redeals-string))))
  361.  
  362.  
  363. ;;;;
  364. ;; Lists the options.
  365. ;;
  366. ;; Returns: list of names for options and their current values
  367. ;;;;
  368. (define (get-options) 
  369.   (list 'begin-exclusive 
  370.     (list (_"Three card deals") deal-three)
  371.     (list (_"Single card deals") (not deal-three))
  372.     'end-exclusive
  373.     (list (_"Autoplay") autoplay)))
  374.  
  375.  
  376. ;;;;
  377. ;; Sets new values for options from the given list.
  378. ;;
  379. ;; Params:
  380. ;;   - options: list of values for the options
  381. ;; Returns: void
  382. ;;;;
  383. (define (apply-options options) 
  384.   (display options)
  385.   (newline)
  386.   (set! deal-three (cadr (list-ref options 1)))
  387.   (set! autoplay (cadr (list-ref options 4)))
  388.   (set! max-redeals (if deal-three 2 0)))
  389.  
  390.  
  391. ;;;;
  392. ;; Checks if the time has run out.
  393. ;;
  394. ;; Returns: true or false
  395. ;;;;
  396. (define (timeout) #f)
  397.  
  398.  
  399. ; droppable? is provided
  400. (set-features droppable-feature)
  401.  
  402.  
  403. ;;;;
  404. ;;
  405. ;; Main. Set callback functions.
  406. ;;
  407. ;;;;
  408. (set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-continuable game-won get-hint get-options apply-options timeout droppable?)
  409.  
  410.